Remediation scripts/Restrict access to App Services/PowerShell/Restrict-AzSecurityWebApps.ps1 (94 lines of code) (raw):

<# .Synopsis Adds an Azure Ip restriction rule to an Azure App Service by doing the following steps 1. Seeking all of your subscrptions within your tenant, looking for the following rule "Restrict access to App Services" 2. You'll be prompted for the WebApp service that is too open, asking for the following required configurations A. Name B. Action ( "Alloy or Deny' ) C. Priority D. IP address block More information mentioned here : https://docs.microsoft.com/en-us/azure/app-service/app-service-ip-restrictions .Requirements Az.Resources Az.Accounts Az.Security .Known Issues AzureRM Module mixed in with Az Module will break scripting due to conflict of current migration #> Function Add-AzIpRestrictionRule { [CmdletBinding()] Param ( # Name of the resource group that contains the App Service. [Parameter(Mandatory=$true, Position=0)] $ResourceGroupName, # Name of your Web or API App. [Parameter(Mandatory=$true, Position=1)] $AppServiceName, # rule to add. [Parameter(Mandatory=$true, Position=2)] [PSCustomObject]$rule ) $ApiVersions = Get-AzResourceProvider -ProviderNamespace Microsoft.Web | Select-Object -ExpandProperty ResourceTypes | Where-Object ResourceTypeName -eq 'sites' | Select-Object -ExpandProperty ApiVersions $LatestApiVersion = $ApiVersions[0] $WebAppConfig = Get-AzResource -ResourceType 'Microsoft.Web/sites/config' -ResourceName $AppServiceName -ResourceGroupName $ResourceGroupName -ApiVersion $LatestApiVersion $WebAppConfig.Properties.ipSecurityRestrictions = $WebAppConfig.Properties.ipSecurityRestrictions + @($rule) | Group-Object name | ForEach-Object { $_.Group | Select-Object -Last 1 } Set-AzResource -ResourceId $WebAppConfig.ResourceId -Properties $WebAppConfig.Properties -ApiVersion $LatestApiVersion -Force } Write-Verbose "Checking for Azure module..." $AzModule = Get-Module -Name "Az.*" -ListAvailable if ($AzModule -eq $null) {     Write-Verbose "Azure PowerShell module not found"     #check for Admin Privleges     $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())     if(-not ($currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))){         #No Admin, install to current user         Write-Warning -Message "Can not install Az Module.  You are not running as Administrator"         Write-Warning -Message "Installing Az Module to Current User Scope"         Install-Module Az -Scope CurrentUser -Force         Install-Module Az.Security -Scope CurrentUser -Force Install-Module Az.Resources -Scope CurrentUser -Force Install-Module Az.Accounts -Scope CurrentUser -Force     }     Else{         #Admin, install to all users         Install-Module -Name Az -AllowClobber -Force Import-Module -Name Az.Accounts -Force         Import-Module -Name Az.Security -Force Import-Module -Name Az.Resources -Force     } } #Login to Azure Login-AzAccount #Get All Subs $Subscriptions = Get-AzSubscription Write-Host "Collecting Subscrptions within tenant. Note: Looking through each subscrption might take some time" #Loop Through Subs foreach($Subscription in $Subscriptions){     $Id = ($Subscription.Id)     Select-AzSubscription $Id | Out-Null     #Get Security Task for App Services     $SecurityTasks += Get-AzSecurityTask | Where-Object {$_.RecommendationType -eq "Restrict access to App Services"} } Write-Host "Found Active 'Restrict Access to App Services' within your subscrption" foreach($SecurityTask in $SecurityTasks){     Write-Host ($SecurityTask.ResourceId) $RuleConfig = $host.ui.Prompt("Access Restrictions for the resource group mentioned above","Enter values for these settings:",@("ipAddress","action","priority","name","description")) # Setting rule into a customobject for importation $rule = [PSCustomObject]@{ ipAddress = "$($RuleConfig.ipAddress)" action = "$($RuleConfig.action)" priority = "$($RuleConfig.priority)" name = "$($RuleConfig.name)" description = "$($RuleConfig.description)" } Add-AzIpRestrictionRule -ResourceGroupName ($ResourceGroupName=$SecurityTask.ResourceId.Split("/")[4]) -AppServiceName ($AppServiceName=$SecurityTask.ResourceId.Split("/")[8]) -rule $rule              }